#include"game.h"

//初始化函数
void csboard(char board[ROWS][COLS],int rows,int cols,char ret)
{
    for(int i=0;i<rows;i++)
    {
        for(int j=0;j<cols;j++)
        {
            board[i][j]=ret;
        }
    }
}


//打印函数
void display(char board[ROWS][COLS],int row,int col)
{
    printf("--------------------------\n");
    for(int k=0;k<=col;k++)
    {
        printf("%d ",k);
    }
    printf("\n");
    printf("————————————————————————\n");
    for(int i=1;i<=row;i++)
    {
        printf("%d|",i);
        for(int j=1;j<=col;j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
    printf("---------------------------\n");
}


//设置雷
void setmine(char board[ROWS][COLS])
{
    int count=boom;
    while(count)
    {
         int x=rand()%9+1;
         int y=rand()%9+1;
        if(board[x][y]=='0')
        {
            board[x][y]='1';
            count--;
        }
    }
}


//统计周围雷的个数
int get_mine_count(char mine[ROWS][COLS],int x,int y)
{
   return (mine[x-1][y]+
          mine[x-1][y-1]+
          mine[x][y-1]+
          mine[x+1][y-1]+
          mine[x+1][y]+
          mine[x-1][y+1]+
          mine[x][y+1]+
          mine[x+1][y+1]-8*'0');
}

//用递归来消除一片
void empty(char show[ROWS][COLS],char mine[ROWS][COLS],int x,int y)
{
    //越界返回
    if(x<1||x>ROW||y<1||y>COL)  return ;
    //已经排过的返回
    if(show[x][y]!='*')  return ;

    //计算格子周围雷数
    int ret=get_mine_count(mine,x,y);
    if(ret>0)
    {
        show[x][y]=ret+'0';
        return;
    }
    else//此位置周围没有雷
    {
       show[x][y]='O';

        empty(show, mine, x-1, y-1); // 左上
        empty(show, mine, x-1, y);   // 上
        empty(show, mine, x-1, y+1); // 右上
        empty(show, mine, x, y-1);   // 左
        empty(show, mine, x, y+1);   // 右
        empty(show, mine, x+1, y-1); // 左下
        empty(show, mine, x+1, y);   // 下
        empty(show, mine, x+1, y+1); // 右下
    }
}


//插旗子操作
void setflag(char show[ROWS][COLS],int* win,int* flag)
{
   int x=0;
   int y=0;
   printf("请输入坐标来插入旗子\n");
v:
   scanf("%d %d",&x,&y);
   if(x>=1&&x<=ROW&&y>=1&&y<=COL)
   {
     if(show[x][y]=='F')
      {
        show[x][y]='*';
        (*flag)--;
        display(show,ROW,COL);
      }

      else if(show[x][y]=='*')
      {
        show[x][y]='F';
         (*flag)++;
          display(show,ROW,COL);
      }
   }
   else
   {
      printf("输入的坐标不合法，请重新输入\n");
      goto v;
   }
}



//找雷
void findmine(char show[ROWS][COLS],char mine[ROWS][COLS],int row,int col)
{
    int win=0;
    int x=0;
    int y=0;
     int flag=0;
    while(win<row*col-boom)
    {
        printf("请输入坐标\n");
        scanf("%d %d",&x,&y);
        if(x>=1&&x<=row&&y>=1&&y<=col)
        {
            if(mine[x][y]=='1')
            {
                printf("很遗憾你被炸死了\n");
                display(mine,ROW,COL);
                break;
            }
            if(show[x][y]!='*')
            {
                printf("坐标输入重复,请重新输入\n");
            }
            else
            {
                empty(show,mine,x,y);//消除一片操作
               display(show,ROW,COL);
               //插旗子操作
               int select=0;
               do
               {
                 printf("是否要插旗子，1.要 、0.不要\033[31m(现已排雷：%d )\033[0m \n",flag);
                 scanf("%d",&select);
                 switch(select)
                 {
                    case 1:
                      setflag(show,&win,&flag);
                    case 0:
                      break;
                 }
               } while(select);
               
             
            }
        }
        else
        {
            printf("坐标不合法,请重新输入\n");
        }

        if(flag==boom)
        {
            printf("恭喜你，游戏胜利\n");
            display(mine,ROW,COL);
        }
    }
}